/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.kamen.gesplan;

import java.util.Date;
import java.util.List;
import javax.swing.DefaultComboBoxModel;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 *
 * @author Roger
 */
class ControladorDomini {


    /* El controlador de domini s'encarrega del controlador de vistes 
     * i també de l'emmagetzamatge de dades, tot i que podria convenir 
     * separar-ho, al igual que amb el tema de les vistes
     */
    private ControladoraVistes CV;
    private static SessionFactory sessionFactory;
    
    public ControladorDomini() {
        sessionFactory = new Configuration()
                .configure() // configures settings from hibernate.cfg.xml
                .buildSessionFactory();
    }
    
    public void Start() {
        
        /* Iniciem el controlador de vistes, i li diem que per començar
         * obri la finestra d'afegir empleat
         */
        CV = new ControladoraVistes();
        CV.mainMenu();

    }
    
    /* Insereix empleat a la base de dades, fa la conversió de nom de rol 
     * i de secció als seus ids corresponents
     */
    public static void Add(String staffName, String surname, Date date_start, 
                     Date date_end, String rol, String section, 
                     String comments) 
    {
        
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        Staff s = new Staff();

        s.setName(staffName);
        s.setSurname(surname);
        s.setDate_start(date_start);
        s.setDate_end(date_end);
        
        /* Consultem el id d'una entrada a la taula rol donat l'atribut de descripció
         * En principi només hauria de tornar un resultat, però em sembla que s'ha de fer 
         * sempre usant la llista, i després agafant el primer element
         */
        List<Integer> rol_id = 
                session.createQuery("select id from Rol WHERE description = '" + rol + "'").list();
        s.setRol_id(rol_id.get(0));
        
        // Ídem per a secció 
        List<Integer> section_id = 
                session.createQuery("select id from Section WHERE description = '" + section + "'").list();
        s.setSection_id(section_id.get(0));
        
        s.setComments(comments);

        session.save(s);
        session.getTransaction().commit();
        session.close();
        
    }
    
    /* Elimina un empleat de la base de dades, donat el seu cognom */ 
    public static int delete(String[] selected) {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        
        int eliminades = 0;
        for (int i=0; i < selected.length; ++i) {
            Query query = session.createQuery("delete Staff where surname = '" + selected[i] + "'");
            int result = query.executeUpdate();
            eliminades += result;
        }
        System.out.println("Entrades eliminades: " + eliminades);
        
        session.getTransaction().commit();
        session.close();
        
        return eliminades;
    }
    
    /* Donat un nom de taula de la base de dades, retorna un 
     * ComboBoxModel omplert amb un dels camps de la taula
     */
    public static DefaultComboBoxModel loadModel(String table) {
        DefaultComboBoxModel model = new DefaultComboBoxModel();
        
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        List result = session.createQuery( "from " + table ).list();
        
        if (table.equals("Staff")) {
            for ( Staff s : (List<Staff>) result ) {
                    model.addElement(s.getSurname());
            }
        }
        else if (table.equals("Rol")) {
            for ( Rol r : (List<Rol>) result ) {
                    model.addElement(r.getDescription());
            }
        }
        else if (table.equals("Section")) {
            for ( Section s : (List<Section>) result ) {
                    model.addElement(s.getDescription());
            }
        }
        
        session.getTransaction().commit();
        session.close();
        return model;
   }
}
